Python Z3约束求解器解决数独问题

您所在的位置:网站首页 数独 唯一解 17个数 Python Z3约束求解器解决数独问题

Python Z3约束求解器解决数独问题

2024-06-19 01:38| 来源: 网络整理| 查看: 265

Z3是由Microsoft Research开发的高性能定理证明器。接下来将使用Python3中的Z3库来实现对数独问题的解决。 关于Python中Z3的使用入门,可以参考这篇博文https://blog.csdn.net/yalecaltech/article/details/90575076

问题分析

在这里插入图片描述 数独问题就是在一个 9 × 9 9\times 9 9×9的格网的每个格子中填入0~9九个数字之一,使得每一行、每一列、每一宫(将整个盘面均分为9个 3 × 3 3\times 3 3×3的九宫格,即为九个宫)中的数都不重复。记 A i j A_{ij} Aij​为第 i i i行第 j j j列的数,本问题的约束条件就是 ∀ i ∀ j ∀ k ( i ≠ k ∧ j ≠ k → ( A i j ≠ A i k ) ∧ ( A i j ≠ A k j ) ) \forall i\forall j\forall k(i\neq k\land j\neq k\rightarrow(A_{ij}\neq A_{ik})\land(A_{ij}\neq A_{kj})) ∀i∀j∀k(i​=k∧j​=k→(Aij​​=Aik​)∧(Aij​​=Akj​)) ∀ i ∀ j ∀ m ∀ n ( ( ( 1 ≤ i , m ≤ 3 ) ∨ ( 4 ≤ i , m ≤ 6 ) ∨ ( 7 ≤ i , m ≤ 9 ) ) ∧ ( ( 1 ≤ j , n ≤ 3 ) ∨ ( 4 ≤ j , n ≤ 6 ) ∨ ( 7 ≤ j , n ≤ 9 ) ) ∧ ( i ≠ m ∨ j ≠ n ) → ( A i j ≠ A m n ) ) \forall i\forall j \forall m\forall n(((1\le i,m\le 3)\lor(4\le i,m\le 6)\lor(7\le i,m\le9))\land ((1\le j,n\le 3)\lor(4\le j,n\le 6)\lor(7\le j,n\le9))\land(i\neq m\lor j\neq n)\rightarrow(A_{ij}\neq A_{mn})) ∀i∀j∀m∀n(((1≤i,m≤3)∨(4≤i,m≤6)∨(7≤i,m≤9))∧((1≤j,n≤3)∨(4≤j,n≤6)∨(7≤j,n≤9))∧(i​=m∨j​=n)→(Aij​​=Amn​))

最初格子内的提示数因不能更改也应该作为约束条件加入求解器中。

完整代码如下:

from z3 import * # 约束变元数组,变元名为a_行_列 arr=[[Int('a_%d_%d'%(i+1,j+1)) for i in range(9)] for j in range(9)] # 初始条件,数字表示提示数,0表示未填入 problem=((0,2,9,0,0,0,4,0,0), (0,0,0,5,0,0,1,0,0), (0,4,0,0,0,0,0,0,0), (0,0,0,0,4,2,0,0,0), (6,0,0,0,0,0,0,7,0), (5,0,2,0,0,0,0,0,0), (7,0,0,3,0,0,0,0,5), (0,1,0,0,9,0,0,0,0), (0,0,0,0,0,0,0,6,0)) # 数独规则约束 Sudoku=[And(arr[i][j]>0,arr[i][j]


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3